/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package org.apache.tomcat.util.bcel;

/**
 * Constants for the project, mostly defined in the JVM specification.
 */
public final class Const {

	/**
	 * One of the access flags for fields, methods, or classes.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5">
	 * Flag definitions for Fields in the Java Virtual Machine Specification (Java SE 8 Edition).</a>
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6">
	 * Flag definitions for Methods in the Java Virtual Machine Specification (Java SE 8 Edition).</a>
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.6-300-D.1-D.1">
	 * Flag definitions for Classes in the Java Virtual Machine Specification (Java SE 8 Edition).</a>
	 */
	public static final short ACC_FINAL = 0x0010;

	/**
	 * One of the access flags for fields, methods, or classes.
	 */
	public static final short ACC_INTERFACE = 0x0200;

	/**
	 * One of the access flags for fields, methods, or classes.
	 */
	public static final short ACC_ABSTRACT = 0x0400;

	/**
	 * One of the access flags for fields, methods, or classes.
	 */
	public static final short ACC_ANNOTATION = 0x2000;

	/**
	 * Marks a constant pool entry as type UTF-8.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.7">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Utf8 = 1;

	/**
	 * Marks a constant pool entry as type Integer.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.4">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Integer = 3;

	/**
	 * Marks a constant pool entry as type Float.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.4">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Float = 4;

	/**
	 * Marks a constant pool entry as type Long.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.5">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Long = 5;

	/**
	 * Marks a constant pool entry as type Double.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.5">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Double = 6;

	/**
	 * Marks a constant pool entry as a Class
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.1">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Class = 7;

	/**
	 * Marks a constant pool entry as a Field Reference.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.2">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Fieldref = 9;

	/**
	 * Marks a constant pool entry as type String
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.3">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_String = 8;

	/**
	 * Marks a constant pool entry as a Method Reference.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.2">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_Methodref = 10;

	/**
	 * Marks a constant pool entry as an Interface Method Reference.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.2">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_InterfaceMethodref = 11;

	/**
	 * Marks a constant pool entry as a name and type.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.6">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_NameAndType = 12;

	/**
	 * Marks a constant pool entry as a Method Handle.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.8">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_MethodHandle = 15;

	/**
	 * Marks a constant pool entry as a Method Type.
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.9">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_MethodType = 16;

	/**
	 * Marks a constant pool entry as an Invoke Dynamic
	 *
	 * @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4.10">
	 * The Constant Pool in The Java Virtual Machine Specification</a>
	 */
	public static final byte CONSTANT_InvokeDynamic = 18;

	/**
	 * Marks a constant pool entry as a Module Reference.
	 * Note: Early access Java 9 support- currently subject to change.
	 *
	 * @see <a href="http://cr.openjdk.java.net/~mr/jigsaw/spec/lang-vm.html#jigsaw-2.6">
	 * JPMS: Modules in the Java Language and JVM</a>
	 */
	public static final byte CONSTANT_Module = 19;

	/**
	 * Marks a constant pool entry as a Package Reference.
	 * Note: Early access Java 9 support- currently subject to change.
	 *
	 * @see <a href="http://cr.openjdk.java.net/~mr/jigsaw/spec/lang-vm.html#jigsaw-2.6">
	 * JPMS: Modules in the Java Language and JVM</a>
	 */
	public static final byte CONSTANT_Package = 20;

	/**
	 * The names of the types of entries in a constant pool.
	 * Use getConstantName instead
	 */
	private static final String[] CONSTANT_NAMES = {
			"", "CONSTANT_Utf8", "", "CONSTANT_Integer",
			"CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double",
			"CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref",
			"CONSTANT_Methodref", "CONSTANT_InterfaceMethodref",
			"CONSTANT_NameAndType", "", "", "CONSTANT_MethodHandle",
			"CONSTANT_MethodType", "", "CONSTANT_InvokeDynamic",
			"CONSTANT_Module", "CONSTANT_Package"};

	public static String getConstantName(int index) {
		return CONSTANT_NAMES[index];
	}
}
